home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1994-06-07 | 10.8 KB | 334 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Geneva
- Geneva
- Geneva
- MODULE FormViews;
- (* OmInc
- IMPORT
- Domains, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Containers,
- FormModels;
- CONST
- (** minimal border between form view and any embedded view: **)
- minBorder* = 4 * Ports.point; maxBorder* = 100 * Ports.mm;
- maxSize = 600 * Ports.mm;
- (* range of currently supported versions *)
- minVersion = 0; maxBaseVersion = 0; maxStdVersion = 0;
- TYPE
- View* = POINTER TO ViewDesc;
- ViewDesc* = RECORD (Containers.ViewDesc)
- border-: LONGINT;
- grid-: LONGINT; (** grid > 0 **)
- gridFactor-: INTEGER; (** gridFactor > 0 **)
- showGrid-: BOOLEAN (** temporary, preset to FALSE **)
- END;
- Directory* = POINTER TO DirectoryDesc;
- DirectoryDesc* = RECORD END;
- StdView = POINTER TO StdViewDesc;
- StdViewDesc = RECORD (ViewDesc)
- cache: FormModels.Reader (* reuse form reader *)
- END;
- StdDirectory = POINTER TO StdDirectoryDesc;
- StdDirectoryDesc = RECORD (DirectoryDesc) END;
- ViewOp = POINTER TO ViewOpDesc;
- ViewOpDesc = RECORD (Domains.OperationDesc)
- view: View; (* view # NIL *)
- border: LONGINT; (* border >= minBorder *)
- grid: LONGINT; (* grid > 0 *)
- gridFactor: INTEGER (* gridFactor > 0 *)
- END;
- dir-, stdDir-: Directory;
- ctrldir-: Containers.Directory;
- (** View **)
- PROCEDURE (v: View) Clone* (): View;
- VAR s: Stores.Store;
- BEGIN
- s := Stores.Clone(v); RETURN s(View)
- END Clone;
- PROCEDURE (v: View) Internalize* (VAR rd: Stores.Reader);
- VAR thisVersion: SHORTINT;
- BEGIN
- v.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxBaseVersion, thisVersion);
- IF rd.cancelled THEN RETURN END;
- rd.ReadLInt(v.border);
- rd.ReadLInt(v.grid);
- rd.ReadInt(v.gridFactor)
- END Internalize;
- PROCEDURE (v: View) Externalize* (VAR wr: Stores.Writer);
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxBaseVersion);
- wr.WriteLInt(v.border);
- wr.WriteLInt(v.grid);
- wr.WriteInt(v.gridFactor)
- END Externalize;
- PROCEDURE (v: View) CopyFrom* (source: Views.View);
- BEGIN
- v.CopyFrom^(source);
- WITH source: View DO
- v.border := source.border;
- v.grid := source.grid;
- v.gridFactor := source.gridFactor;
- v.showGrid := source.showGrid
- END
- END CopyFrom;
- PROCEDURE (v: View) InitModel* (model: Containers.Model);
- (** covariant model **)
- BEGIN
- v.InitModel^(model); ASSERT(model IS FormModels.Model, 23)
- END InitModel;
- PROCEDURE (v: View) ThisModel* (): FormModels.Model;
- (** covariant model **)
- VAR m: Containers.Model;
- BEGIN
- m := v.ThisModel^();
- IF m # NIL THEN RETURN m(FormModels.Model) ELSE RETURN NIL END
- END ThisModel;
- PROCEDURE (v: View) GetRect* (f: Views.Frame; view: Views.View; VAR l, t, r, b: LONGINT);
- BEGIN
- FormModels.GetRect(view, l, t, r, b)
- END GetRect;
- PROCEDURE (v: View) SetBorder* (border: LONGINT);
- (** border >= 0 20 **)
- VAR op: ViewOp;
- BEGIN
- ASSERT(border >= 0, 20);
- IF border < minBorder THEN
- border := minBorder
- ELSIF border > maxBorder THEN
- border := maxBorder
- END;
- NEW(op); op.view := v; op.border := border;
- op.grid := v.grid; op.gridFactor := v.gridFactor;
- Views.Do(v, "#Form:BorderChange", op)
- END SetBorder;
- PROCEDURE (v: View) SetGrid* (grid: LONGINT; gridFactor: INTEGER);
- grid > 0 20
- gridFactor > 0 21
- VAR op: ViewOp;
- BEGIN
- ASSERT(grid > 0, 20); ASSERT(gridFactor > 0, 21);
- NEW(op); op.view := v; op.border := v.border;
- op.grid := grid; op.gridFactor := gridFactor;
- Views.Do(v, "#Form:GridChange", op)
- END SetGrid;
- PROCEDURE (v: View) ShowGrid* (showGrid: BOOLEAN);
- BEGIN
- IF showGrid # v.showGrid THEN
- v.showGrid := showGrid;
- Views.Update(v, Views.keepFrames)
- END
- END ShowGrid;
- (** Directory **)
- PROCEDURE (d: Directory) New* (f: FormModels.Model): View;
- f # NIL 20
- f.init 21
- BEGIN
- HALT(127)
- END New;
- (* ViewOp *)
- PROCEDURE (op: ViewOp) Do;
- VAR border, grid: LONGINT; gridFactor: INTEGER;
- BEGIN
- (* save old state of view *)
- border := op.view.border; grid := op.view.grid; gridFactor := op.view.gridFactor;
- (* set new state of view *)
- op.view.border := op.border; op.view.grid := op.grid; op.view.gridFactor := op.gridFactor;
- Views.Update(op.view, Views.keepFrames);
- (* old state is new undo state *)
- op.border := border; op.grid := grid; op.gridFactor := gridFactor
- END Do;
- (* StdView *)
- PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: SHORTINT;
- BEGIN
- v.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxStdVersion, thisVersion)
- END Internalize;
- PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxStdVersion)
- END Externalize;
- PROCEDURE (v: StdView) Background (): Ports.Color;
- BEGIN
- RETURN Dialog.background
- END Background;
- PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- VAR form: FormModels.Model; ctrl: Containers.Controller;
- focus, q: Views.View; k, w, h, x, y: LONGINT; s: FormModels.Reader;
- BEGIN
- form := v.ThisModel();
- IF form # NIL THEN
- ctrl := v.ThisController();
- IF ctrl # NIL THEN focus := ctrl.ThisFocus() ELSE focus := NIL END;
- s := form.NewReader(v.cache); v.cache := s;
- s.Set(NIL); s.ReadView(q); k := 0;
- WHILE q # NIL DO
- IF (s.r >= l) & (s.b >= t) & (s.l < r) & (s.t < b) THEN
- Views.InstallFrame(f, q, s.l, s.t, k, q = focus)
- END;
- s.ReadView(q); INC(k)
- END
- ELSE
- f.DrawRect(l, t, r, b, Ports.fill, Ports.grey12)
- END;
- IF v.showGrid THEN
- k := v.grid * v.gridFactor; ASSERT(k > 0, 100);
- v.context.GetSize(w, h);
- IF w > maxSize THEN w := maxSize END;
- IF h > maxSize THEN h := maxSize END;
- x := l - l MOD k;
- WHILE x <= w DO
- f.MarkRect(x, 0, x + f.unit, h, Ports.fill, Ports.dim50, Ports.show);
- INC(x, k)
- END;
- y := t - t MOD k;
- WHILE y <= h DO
- f.MarkRect(0, y, w, y + f.unit, Ports.fill, Ports.dim50, Ports.show);
- INC(y, k)
- END
- END
- END Restore;
- PROCEDURE (v: StdView) HandleModelMsg (VAR msg: Models.Message);
- BEGIN
- v.HandleModelMsg^(msg);
- WITH msg: Models.UpdateMsg DO
- WITH msg: FormModels.UpdateMsg DO
- Views.UpdateIn(v, msg.l, msg.t, msg.r, msg.b, Views.rebuildFrames)
- ELSE
- Views.Update(v, Views.rebuildFrames) (* catch all update messages *)
- END
- ELSE
- END
- END HandleModelMsg;
- PROCEDURE GetBounds (v: StdView; VAR w, h: LONGINT);
- VAR form: FormModels.Model; r, b: LONGINT; p: FormModels.Reader; q: Views.View;
- BEGIN
- form := v.ThisModel();
- IF form # NIL THEN
- p := form.NewReader(v.cache); v.cache := p;
- p.Set(NIL); (* set reader to bottom of view list *)
- p.ReadView(q); (* read bottom-most view *)
- IF q # NIL THEN
- r := 0; b := 0;
- WHILE q # NIL DO
- IF p.r > r THEN r := p.r END;
- IF p.b > b THEN b := p.b END;
- p.ReadView(q)
- END;
- w := r + v.border; h := b + v.border
- END
- END
- END GetBounds;
- PROCEDURE AssertRange (border: LONGINT; VAR w, h: LONGINT);
- VAR min: LONGINT;
- BEGIN (* prevent illegal values *)
- min := 2 * border + FormModels.minViewSize;
- IF w = Views.undefined THEN w := 100 * Ports.mm
- ELSIF w < min THEN w := min
- ELSIF w > maxSize THEN w := maxSize
- END;
- IF h = Views.undefined THEN h := 70 * Ports.mm
- ELSIF h < min THEN h := min
- ELSIF h > maxSize THEN h := maxSize
- END
- END AssertRange;
- PROCEDURE (v: StdView) HandlePropMsg (VAR p: Properties.Message);
- BEGIN
- v.HandlePropMsg^(p);
- WITH p: Properties.BoundsPref DO
- GetBounds(v, p.w, p.h)
- | p: Properties.SizePref DO
- AssertRange(v.border, p.w, p.h)
- ELSE
- END
- END HandlePropMsg;
- (* StdDirectory *)
- PROCEDURE (d: StdDirectory) New (f: FormModels.Model): View;
- VAR v: StdView; grid: LONGINT; gridFactor: INTEGER;
- BEGIN
- ASSERT(f # NIL, 20); ASSERT(f.init, 21);
- NEW(v); v.InitModel(f);
- IF ctrldir # NIL THEN v.SetController(ctrldir.New()) END;
- v.SetBorder(minBorder);
- IF Dialog.metricSystem THEN
- grid := Ports.mm; gridFactor := 10 (* place at 1mm resolution *)
- ELSE
- grid := Ports.inch DIV 20; gridFactor := 20 (* place at 1.27mm resolution *)
- END;
- v.SetGrid(grid, gridFactor);
- v.ShowGrid(TRUE);
- v.Init;
- RETURN v
- END New;
- (** miscellaneous **)
- PROCEDURE Focus* (): View;
- VAR v: Views.View;
- BEGIN
- v := Controllers.FocusView();
- IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END
- END Focus;
- PROCEDURE FocusModel* (): FormModels.Model;
- VAR v: View;
- BEGIN
- v := Focus();
- IF v # NIL THEN RETURN v.ThisModel() ELSE RETURN NIL END
- END FocusModel;
- PROCEDURE RoundToGrid* (v: View; VAR x, y: LONGINT);
- VAR grid: LONGINT;
- BEGIN
- grid := v.grid;
- x := x + grid DIV 2;
- y := y + grid DIV 2;
- x := x - x MOD grid;
- y := y - y MOD grid
- END RoundToGrid;
- PROCEDURE Deposit*;
- BEGIN
- Views.Deposit(dir.New(FormModels.dir.New()))
- END Deposit;
- PROCEDURE SetDir* (d: Directory);
- BEGIN
- ASSERT(d # NIL, 20); dir := d
- END SetDir;
- PROCEDURE SetCtrlDir* (d: Containers.Directory);
- BEGIN
- ASSERT(d # NIL, 20); ctrldir := d
- END SetCtrlDir;
- PROCEDURE Init;
- VAR d: StdDirectory; res: LONGINT;
- BEGIN
- Dialog.Call("FormControllers.Install", "#Form:CntrlInstallFailed", res);
- NEW(d); dir := d; stdDir := d
- END Init;
- BEGIN
- Init
- END FormViews.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Geneva
- Documents.ControllerDesc
-